home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / data / etc / round4.lzh / enemy.c < prev    next >
C/C++ Source or Header  |  1999-01-04  |  6KB  |  357 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <XSP2lib.H>
  5. #include "boss01.h"
  6. #include "enemy.h"
  7. #include "fxsp2lib.h"
  8.  
  9. #define enemy_MAX    64    /* 最大数 */
  10.  
  11. #define P_OFFSET    8.0    /* 初期座標オフセット */
  12. #define P_V0        0.2    /* 初速 */
  13. #define P_A    0.5        /* 加速度 */
  14. #define P_MAXV    1.5        /* 速度最大値 */
  15. #define P_K    0.9        /* ばね定数 */
  16. #define P_M    0.2        /* 摩擦計数 */
  17.  
  18.  
  19. ENEMY *enemy, *enemy_top, *enemy_null_top;
  20. extern char end_of_data;
  21.  
  22. int enemy_init0 (void)
  23. {
  24.     int i;
  25.  
  26.     if ((enemy = malloc (sizeof (enemy) * enemy_MAX)) == NULL)
  27.         return (-1);
  28.  
  29.     enemy_top = NULL;
  30.     enemy_null_top = enemy;
  31.     for (i = 0; i < enemy_MAX; i++) {
  32.         enemy[i].next = &enemy[i + 1];
  33.     }
  34.     enemy[enemy_MAX - 1].next = NULL;
  35.  
  36.     return (0);
  37. }
  38.  
  39.  
  40.  
  41. void enemy_init (short type, short pt, short info, short ox, short oy)
  42. {
  43.     if (enemy_null_top != NULL) {
  44.         ENEMY *p;
  45.  
  46.         p = enemy_null_top;
  47.         enemy_null_top = p->next;
  48.         p->next = enemy_top;
  49.         enemy_top = p;
  50.  
  51.         p->type = type;
  52.         p->pt = pt;
  53.         p->info = info;
  54.         p->ox = ox;
  55.         p->oy = oy;
  56.         switch (type) {
  57.         case 0:    /* 本体 */
  58.         case 1:
  59.         case 2:
  60.         case 3:
  61.             break;
  62.         case 4:    /* 可動部(左上) */
  63.         case 5:
  64.         case 6:
  65.         case 7:
  66.             p->lx = P_OFFSET;
  67.             p->ly = P_OFFSET;
  68.             p->vx = -P_V0;
  69.             p->vy = -P_V0;
  70.             p->cyc = 0;
  71.             break;
  72.         case 8:    /* 可動部(右上) */
  73.         case 9:
  74.         case 10:
  75.         case 11:
  76.             p->lx = -P_OFFSET;
  77.             p->ly = P_OFFSET;
  78.             p->vx = P_V0;
  79.             p->vy = -P_V0;
  80.             p->cyc = 0;
  81.             break;
  82.         case 12:    /* 可動部(左下) */
  83.         case 13:
  84.         case 14:
  85.         case 15:
  86.             p->lx = P_OFFSET;
  87.             p->ly = -P_OFFSET;
  88.             p->vx = -P_V0;
  89.             p->vy = P_V0;
  90.             p->cyc = 0;
  91.             break;
  92.         case 16:    /* 可動部(右下) */
  93.         case 17:
  94.         case 18:
  95.         case 19:
  96.             p->lx = -P_OFFSET;
  97.             p->ly = -P_OFFSET;
  98.             p->vx = P_V0;
  99.             p->vy = P_V0;
  100.             p->cyc = 0;
  101.             break;
  102.         default:
  103.             break;
  104.         }
  105.     }
  106. }
  107.  
  108.  
  109.  
  110. void enemy_move (void)
  111. {
  112.     ENEMY *p, *q;
  113.  
  114.     p = enemy_top;
  115.     q = NULL;
  116.     while (p != NULL) {
  117.         char erase_flag = 0;
  118.  
  119.         switch (p->type) {
  120.         case 0:    /* 本体 */
  121.         case 1:
  122.         case 2:
  123.         case 3:
  124.             p->x = p->ox;
  125.             p->y = p->oy;
  126.             p->x += (128 + 16);    /* 表示用に補正 */
  127.             p->y += (128 + 16);
  128.             xsp_set_st (p);
  129.             fxsp_set_st (p);
  130.             p->x -= (128 + 16);
  131.             p->y -= (128 + 16);
  132.  
  133.             break;
  134.  
  135.         case 4:    /* 可動部(左上) */
  136.         case 5:
  137.         case 6:
  138.         case 7:
  139.             switch (p->cyc) {
  140.             case 0:
  141.                 p->vx -= P_A;
  142.                 if (p->vx < -P_MAXV)
  143.                     p->vx = -P_MAXV;
  144.                 p->vy -= P_A;
  145.                 if (p->vy < -P_MAXV)
  146.                     p->vy = -P_MAXV;
  147.                 if (p->lx < 0)
  148.                     p->cyc++;
  149.                 break;
  150.             case 1:
  151.                 /* ばね運動 */
  152.                 p->vx -= p->lx * P_K;
  153.                 p->vy -= p->ly * P_K;
  154.                 /* 摩擦 */
  155.                 if (p->vx > 0)
  156.                     p->vx -= P_M;
  157.                 else
  158.                     p->vx += P_M;
  159.                 if (p->vy > 0)
  160.                     p->vy -= P_M;
  161.                 else
  162.                     p->vy += P_M;
  163. /* 終了判定 */
  164.     if ((fabs(p->vx)<0.5)&&((fabs(p->lx)<0.8)))
  165.         end_of_data = !0;
  166.  
  167.                 break;
  168.             }
  169.             p->lx += p->vx;
  170.             p->ly += p->vy;
  171. //            p->x = p->ox + p->lx;
  172. //            p->y = p->oy + p->ly;
  173.             p->x = p->ox + floor(fabs(p->lx))*(p->lx/fabs(p->lx));
  174.             p->y = p->oy + floor(fabs(p->ly))*(p->ly/fabs(p->ly));
  175.  
  176.             p->x += (128 + 16);    /* 表示用に補正 */
  177.             p->y += (128 + 16);
  178.             xsp_set_st (p);
  179.             fxsp_set_st (p);
  180.             p->x -= (128 + 16);
  181.             p->y -= (128 + 16);
  182.             break;
  183.  
  184.         case 8:    /* 可動部(右上) */
  185.         case 9:
  186.         case 10:
  187.         case 11:
  188.             switch (p->cyc) {
  189.             case 0:
  190.                 p->vx += P_A;
  191.                 if (p->vx > P_MAXV)
  192.                     p->vx = P_MAXV;
  193.                 p->vy -= P_A;
  194.                 if (p->vy < -P_MAXV)
  195.                     p->vy = -P_MAXV;
  196.                 if (p->lx > 0)
  197.                     p->cyc++;
  198.                 break;
  199.             case 1:
  200.                 /* ばね運動 */
  201.                 p->vx -= p->lx * P_K;
  202.                 p->vy -= p->ly * P_K;
  203.                 /* 摩擦 */
  204.                 if (p->vx > 0)
  205.                     p->vx -= P_M;
  206.                 else
  207.                     p->vx += P_M;
  208.                 if (p->vy > 0)
  209.                     p->vy -= P_M;
  210.                 else
  211.                     p->vy += P_M;
  212.                 break;
  213.             }
  214.             p->lx += p->vx;
  215.             p->ly += p->vy;
  216. //            p->x = p->ox + p->lx;
  217. //            p->y = p->oy + p->ly;
  218.             p->x = p->ox + floor(fabs(p->lx))*(p->lx/fabs(p->lx));
  219.             p->y = p->oy + floor(fabs(p->ly))*(p->ly/fabs(p->ly));
  220.  
  221.             p->x += (128 + 16);    /* 表示用に補正 */
  222.             p->y += (128 + 16);
  223.             xsp_set_st (p);
  224.             fxsp_set_st (p);
  225.             p->x -= (128 + 16);
  226.             p->y -= (128 + 16);
  227.             break;
  228.  
  229.         case 12:    /* 可動部(左下) */
  230.         case 13:
  231.         case 14:
  232.         case 15:
  233.             switch (p->cyc) {
  234.             case 0:
  235.                 p->vx -= P_A;
  236.                 if (p->vx < -P_MAXV)
  237.                     p->vx = -P_MAXV;
  238.                 p->vy += P_A;
  239.                 if (p->vy > P_MAXV)
  240.                     p->vy = P_MAXV;
  241.                 if (p->lx < 0)
  242.                     p->cyc++;
  243.                 break;
  244.             case 1:
  245.                 /* ばね運動 */
  246.                 p->vx -= p->lx * P_K;
  247.                 p->vy -= p->ly * P_K;
  248.                 /* 摩擦 */
  249.                 if (p->vx > 0)
  250.                     p->vx -= P_M;
  251.                 else
  252.                     p->vx += P_M;
  253.                 if (p->vy > 0)
  254.                     p->vy -= P_M;
  255.                 else
  256.                     p->vy += P_M;
  257.                 break;
  258.             }
  259.             p->lx += p->vx;
  260.             p->ly += p->vy;
  261. //            p->x = p->ox + p->lx;
  262. //            p->y = p->oy + p->ly;
  263.             p->x = p->ox + floor(fabs(p->lx))*(p->lx/fabs(p->lx));
  264.             p->y = p->oy + floor(fabs(p->ly))*(p->ly/fabs(p->ly));
  265.  
  266.             p->x += (128 + 16);    /* 表示用に補正 */
  267.             p->y += (128 + 16);
  268.             xsp_set_st (p);
  269.             fxsp_set_st (p);
  270.             p->x -= (128 + 16);
  271.             p->y -= (128 + 16);
  272.             break;
  273.  
  274.         case 16:    /* 可動部(右下) */
  275.         case 17:
  276.         case 18:
  277.         case 19:
  278.             switch (p->cyc) {
  279.             case 0:
  280.                 p->vx += P_A;
  281.                 if (p->vx > P_MAXV)
  282.                     p->vx = P_MAXV;
  283.                 p->vy += P_A;
  284.                 if (p->vy > P_MAXV)
  285.                     p->vy = P_MAXV;
  286.                 if (p->lx > 0)
  287.                     p->cyc++;
  288.                 break;
  289.             case 1:
  290.                 /* ばね運動 */
  291.                 p->vx -= p->lx * P_K;
  292.                 p->vy -= p->ly * P_K;
  293.                 /* 摩擦 */
  294.                 if (p->vx > 0)
  295.                     p->vx -= P_M;
  296.                 else
  297.                     p->vx += P_M;
  298.                 if (p->vy > 0)
  299.                     p->vy -= P_M;
  300.                 else
  301.                     p->vy += P_M;
  302.                 break;
  303.             }
  304.             p->lx += p->vx;
  305.             p->ly += p->vy;
  306. //            p->x = p->ox + p->lx;
  307. //            p->y = p->oy + p->ly;
  308.             p->x = p->ox + floor(fabs(p->lx))*(p->lx/fabs(p->lx));
  309.             p->y = p->oy + floor(fabs(p->ly))*(p->ly/fabs(p->ly));
  310.  
  311.             p->x += (128 + 16);    /* 表示用に補正 */
  312.             p->y += (128 + 16);
  313.             xsp_set_st (p);
  314.             fxsp_set_st (p);
  315.             p->x -= (128 + 16);
  316.             p->y -= (128 + 16);
  317.             break;
  318.  
  319.         default:
  320.             break;
  321.         }
  322.  
  323.  
  324.         if (erase_flag) {
  325.             if (q == NULL) {    /* リストの一番最初を削除 */
  326.                 enemy_top = p->next;
  327.                 p->next = enemy_null_top;
  328.                 enemy_null_top = p;
  329.                 q = NULL;
  330.                 p = enemy_top;
  331.             } else {
  332.                 q->next = p->next;
  333.                 p->next = enemy_null_top;
  334.                 enemy_null_top = p;
  335.                 p = q->next;
  336.             }
  337.         } else {
  338.             q = p;
  339.             p = p->next;
  340.         }
  341.     }
  342. }
  343.  
  344.  
  345. void enemy_tini (void)
  346. {
  347.     int i;
  348.  
  349.     enemy_top = NULL;
  350.     enemy_null_top = enemy;
  351.     for (i = 0; i < enemy_MAX; i++) {
  352.         enemy[i].next = &enemy[i + 1];
  353.     }
  354.     enemy[enemy_MAX - 1].next = NULL;
  355.  
  356. }
  357.